package br.com.bean;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.enterprise.context.SessionScoped;
import javax.faces.bean.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;

import org.primefaces.event.SelectEvent;

import br.com.domain.Menu;
import br.com.domain.Perfil;
import br.com.domain.Usuario;
import br.com.exception.BeanException;
import br.com.exception.ServiceException;
import br.com.filter.UsuarioFilter;
import br.com.service.GenericServiceImpl;
import br.com.service.UsuarioService;
import br.com.util.DomainListDataModel;


@Named
@SessionScoped
public class UsuarioBean extends GenericBean{
	
	private static final long serialVersionUID = 1L;
	
	/**************************************************************************/
	/**                                ATRIBUTOS                             **/
	/**************************************************************************/
	
	/** Service **/	 
	@Inject 
	private UsuarioService usuarioService; 
	
	/** BEAN INJETADO **/
	@Inject
	private StartupBean startupBean;
	
	/** BEAN INJETADO **/
	@Inject
	private MenuBean menuBean;
	
	/** BEAN INJETADO **/
	@Inject
	private SessionBean sessionBean;
	
	/** Objeto Principal do Bean **/
	private Usuario usuario = new Usuario();	
	
	/** Objeto Filtro do Bean **/
	private UsuarioFilter usuarioFilter = new UsuarioFilter();	
	
	/** Lista Principal do Bean **/
	private DomainListDataModel listUsuario;
	
	/** Lista Principal para os usuarios selecionados do Bean **/
	private List<Usuario> listUsuarioSelecionado;
	
	/** Lista Principal do Bean **/
	private List<Perfil> listPerfil;
	
	/** Flag de Novo **/
	private Perfil perfil;
	
	/**************************************************************************/
	/**                                M�TODOS                               **/
	/**************************************************************************/
	
	/** LOAD PAGE **/
	public void loadPage()  {
	}
	
	/** LOGAR **/	
	public  void logar() {
		
		try {
			
			 /** CRIANDO DADOS FIXOS DA APLICACAO ***/
			startupBean.createDadosIniciais();
			
			/** LOGAR USUARIO **/
			Usuario usuarioLogado = 
					 usuarioService.logarUsuario(this.usuario.getLogin(), this.usuario.getSenha());
			
			/** RECRIANDO MENU DO USUARIO **/
			menuBean.setListMenuUsuario(new ArrayList<Menu>());
			
			/** SETANDO USUARIO NA SESSAO **/
			sessionBean.setUsuarioLogado(usuarioLogado);
			
			if (usuarioLogado.getAlterarSenha()) {
				/** Alterar Senha **/
				goPage("pageLoginAlterarSenha");
			} else {
				/** INICIALIZAR **/
				goPage("pageInicial");
			}

		} catch (ServiceException e) {
			MessageBean.showAlertMessage(e.getMessage());
		}
		
	}
	
	/** ALTERAR SENHA **/	
	public  void alterarSenha()  {
		super.goPage("pageLoginAlterarSenha");
	}
	
	/** SALVAR NOVA SENHA - ALTERAR **/	
	public  void salvarNovaSenha()  {	
		
		try {
		
			this.usuarioService.salvarNovaSenha
			     (sessionBean.getUsuarioLogado(), usuario.getSenhaAtual(),
			    	  usuario.getSenhaConfirmar(), usuario.getSenhaNova());
			this.logoff();
		
		} catch (ServiceException e) {
			MessageBean.showAlertMessage(e.getMessage());
		}
	}
	
	/** LOGOUT **/	
	public  void logoff()  {	
		
		/** REMOVENDO SESSAO **/
		sessionBean.killSession();
		super.goPage("pageLogin");
	}
	
	/** NOVO **/	
	public  void novo() {
		this.activeModoNovo();
		usuario = new Usuario();
		usuario.setAlterarSenha(Boolean.TRUE);
		
		super.goPage("pageUsuarioCad");
	}
	
	/** SALVAR **/
	public  void salvar()  {	
		try {
			
			if(getIsEditRecord()){
				usuarioService.validarSenhaAoEditar(this.usuario);
			}
			
			if (!this.validarDomain(this.usuario)) {
				return;
			}
			
			usuarioService.salvar(this.usuario);
			MessageBean.showInfoMessagePorChave("msg-info-operacao-sucesso");
			this.goPage("pageUsuarioList");
		} catch (Exception e) {
			MessageBean.showAlertMessage(e.getMessage());
		}
	}
	
	/** EDITAR **/
	public  void editar() throws ServiceException {
		this.activeModoEditar();
		this.usuario.setSenhaBanco(usuario.getSenha());
		this.editar(this.usuario);
		this.goPage("pageUsuarioCad");
	}
	
	
	/** EXCLUIR **/
	public  void excluir()  {
		try {
			this.activeModoExcluir();
			this.usuarioService.excluir(this.usuario);
			this.buscarTodos();
			this.goPage("pageUsuarioList");
			
		} catch (Exception e) {
			MessageBean.showAlertMessage(e.getMessage());
		}
	}

	/** BUSCAR TODOS **/
	public DomainListDataModel buscarTodos() {
		try{
			
		  this.listUsuario =  this.buscarTodos(Usuario.class);
		  
		} catch (Exception e) {
			MessageBean.showAlertMessage(e.getMessage());
		}
		return this.listUsuario;
	}
	
	/** BUSCAR POR FILTRO **/
	public void buscarPorFiltro()  {
		try {
			this.listUsuario = buscarPorFiltro(this.usuarioFilter);
		} catch (BeanException e) {
			MessageBean.showErrorMessage(e.getMessage());
		}
	}
	
	/**
	 * LINHA SELECIONADA
	 * @return void
	 * @throws ServiceException 
	 */
	public void onRowSelect(SelectEvent  event) throws ServiceException {
		this.usuario = (Usuario) event.getObject();
		
	}
	
	
	/** CANCELAR QUANDO FOR A TELA DE TROCAR DE SENHA **/
	public void cancelarAlterarSenha() {
		if(usuarioService.existeUsuarioAndAlerarSenha(sessionBean.getUsuarioLogado())){
			 MessageBean.showInfoMessagePorChave("msg-info-cancelar-sucesso");
			 this.goPage("pageInicial");
		}else{
			 MessageBean.showInfoMessagePorChave("msg-info-cancelar-sucesso");
			logoff();
		}
	}
	
	/** VOLTAR **/
	public void voltar() {
	   this.goPage("pageUsuarioList");
	}
	
	
	/**************************************************************************/
	/**                         VALIDAR PERMISSOES                           **/
	/**************************************************************************/
	
	/** PERMISSAO - ALTERA�AO  **/ 
	public Boolean permissaoAlterar() {
		Boolean retorno = Boolean.FALSE;
		try {
			
			retorno= usuarioService.permissaoMenu
	    		      (sessionBean.getUsuarioLogado(), menuBean.getMenuItemClickado()).getAlterar();
	     
		} catch (ServiceException e) {
			MessageBean.showAlertMessage(e.getMessage());
		}
		return retorno;
		
		
	}
	
	/** PERMISSAO - EXCLUSAO  **/
	public Boolean permissaoExcluir() throws ServiceException {
		Boolean retorno = Boolean.FALSE;
		try {
			
			retorno = usuarioService.permissaoMenu
	    		      (sessionBean.getUsuarioLogado(), menuBean.getMenuItemClickado()).getExcluir();
	     
		} catch (ServiceException e) {
			MessageBean.showAlertMessage( e.getMessage());
		}
		
		return retorno;
	}
	
	/** PERMISSAO - INCLUIR  **/
	public Boolean permissaoIncluir() throws ServiceException {
		Boolean retorno = Boolean.FALSE;
		try {
			
			retorno = usuarioService.permissaoMenu
	    		      (sessionBean.getUsuarioLogado(), menuBean.getMenuItemClickado()).getIncluir();
	     
		} catch (ServiceException e) {
			MessageBean.showAlertMessage(e.getMessage());
		}
		
		return retorno;
	}
	
	/** PERMISSAO - EXCLUSAO  **/
	public Boolean menuVisivel() throws ServiceException {
		Boolean retorno = Boolean.FALSE;
		try {
			
			retorno = usuarioService.permissaoMenu
	    		      (sessionBean.getUsuarioLogado(), menuBean.getMenuItemClickado()).getVisivel();
	     
		} catch (ServiceException e) {
			MessageBean.showAlertMessage( e.getMessage());
		}
		
		return retorno;
	}
	
	/** PERMISSAO - INCLUIR OU ALTERAR  **/
	public Boolean permissaoIncluirOrAlterar() throws ServiceException {
		Boolean retorno = Boolean.FALSE;
		try {
			
			retorno = (this.permissaoIncluir() || this.permissaoAlterar()) && menuVisivel();
	     
		} catch (ServiceException e) {
			MessageBean.showAlertMessage(e.getMessage());
		}
		
		return retorno;
	}
	
	/** PERMISSAO - INCLUIR E ALTERAR  **/
	public Boolean permissaoIncluirAndAlterar() throws ServiceException {
		Boolean retorno = Boolean.FALSE;
		try {
			
			retorno = this.permissaoIncluir() && this.permissaoAlterar() && menuVisivel();
	     
		} catch (ServiceException e) {
			MessageBean.showAlertMessage(e.getMessage());
		}
		
		return retorno;
	}
	
	
	
	
	/**************************************************************************/
	/**                      M�TODOS  COMPLEMENTEARES                        **/
	/**************************************************************************/
	
	 @PostConstruct	 
	 public void init() throws ServiceException{
	    buscarTodos();
	 }

		
	/**************************************************************************/
	/**                           GET's E SET's                              **/
	/**************************************************************************/
	
	 @Override
		public GenericServiceImpl getGenericService() {
			return this.usuarioService;
		}

		@Override
		public DomainListDataModel getListDomain() {
			return this.getListUsuario();
		}	
	
	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public DomainListDataModel getListUsuario() {
		return listUsuario;
	}

	public void setListUsuario(DomainListDataModel listUsuario) {
		this.listUsuario = listUsuario;
	}

	public List<Usuario> getListUsuarioSelecionado() {
		return listUsuarioSelecionado;
	}

	public void setListUsuarioSelecionado(List<Usuario> listUsuarioSelecionado) {
		this.listUsuarioSelecionado = listUsuarioSelecionado;
	}


	public UsuarioService getUsuarioService() {
		return usuarioService;
	}

	public void setUsuarioService(UsuarioService usuarioService) {
		this.usuarioService = usuarioService;
	}

	public List<Perfil> getListPerfil() {
		return listPerfil;
	}

	public void setListPerfil(List<Perfil> listPerfil) {
		this.listPerfil = listPerfil;
	}

	public Perfil getPerfil() {
		return perfil;
	}

	public void setPerfil(Perfil perfil) {
		this.perfil = perfil;
	}

	public MenuBean getMenuBean() {
		return menuBean;
	}

	public void setMenuBean(MenuBean menuBean) {
		this.menuBean = menuBean;
	}

	public SessionBean getSessionBean() {
		return sessionBean;
	}

	public void setSessionBean(SessionBean sessionBean) {
		this.sessionBean = sessionBean;
	}

	public UsuarioFilter getUsuarioFilter() {
		return usuarioFilter;
	}

	public void setUsuarioFilter(UsuarioFilter usuarioFilter) {
		this.usuarioFilter = usuarioFilter;
	}

	public StartupBean getStartupBean() {
		return startupBean;
	}

	public void setStartupBean(StartupBean startupBean) {
		this.startupBean = startupBean;
	}
	
	 @Override
	 public Boolean getIsButtonDeleteDisabled() {		
		 return this.desabilitarExclusao(this.listUsuario, this.listUsuarioSelecionado);
	 }
}
